/**
 * 存在阿里或是微信上的密码是明文还是加密. 
 *                       明文是不安全的
 * 
 * 
 * 重点:哈希算法 md5，哈希算法当向的 A===》B(只能从明文到密文),不能从密文到明文.
 * 
 *              md5 如果指定16进制的表示(一般采用16进制表示)，返回的都是32位.
 * 
 *              md5 密文应该是唯一的，主要明文修改，密文必定变化.
 * 
 *              sha1,与md5类似，也比较常用,用法说md5相类似，
 * 
 *              如果指定16进制的表示(一般采用16进制表示)，返回的都是40位.
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 *                               
 */
/**
 * 
 * 一引入模块 crypto，里面包含了多种算法
 * 
 */

let crypto = require("crypto");

/**
 *二创建一个md5算法
 */

let md5= crypto.createHash('md5');

/**
 * 三.具体的加密逻辑
 */
// let str='hellomd5hellomd5hellomd5hellom45543d5hellomd5h324543543ello345345345345345md5hellomd5hellomd5hellomd5hellomd5';


// md5.update(str);

// /**
//  * 四转成16进制的字符串
//  */
// console.log(md5.digest('hex'));

/**
 * update 可多次执行
 * 
 */
let totalStr='1234567890';

let str1='1';

let str2='2';

let str3='34567890';

// md5.update(totalStr);

// console.log(md5.digest('hex'));//totalStr的md5 16进制的字符串为：e807f1fcf82d132f9bb018ca6738a19f

// md5.update(str1);
// md5.update(str2);
// md5.update(str3);
// console.log(md5.digest('hex'));//分割totalStr的字符串  16进制的字符串为：e807f1fcf82d132f9bb018ca6738a19f

/**
 * 
 * sha1 的使用 里面胡是 1哦，不是l 
 * 也可分段的执行update
 */

let sha1 = crypto.createHash('sha1');
// let strSha1='thisissha1'
// sha1.update(strSha1);
// console.log(sha1.digest('hex').length);//thisissha1 ---》7c2a10ba02a738f99e9f5735ae067c810946b2c2


let strSha11='thisis';
let strSha12='sha1'
sha1.update(strSha11);
sha1.update(strSha12);
console.log(sha1.digest('hex'));               //分段加密--->7c2a10ba02a738f99e9f5735ae067c810946b2c2


/**
 * 了解：对称加密与非对称加密
 * 
 * 什么是对称加密：  简单的说就是，加密的 秘钥与加密的秘钥是一致的
 * 
 * 什么是非对称加密：简单的说就是，加密的 秘钥与加密的秘钥是不一致的
 * 
 */

/**
 * 在cropto里面 对称加密有多种，显示 AES加解密
 * 
 */
/**
 * 
 * @param {*} data 要被加密的数据
 * @param {*} key  加密用的秘钥
 */
function aesEncrypt(data,key){
    const cipher = crypto.createCipher('aes192',key);//根据key值穿件 ciper
    //update(data: string, inputEncoding: Encoding | undefined, outputEncoding: Encoding)
    /**
     * data 要被加密的数据 inputEncoding 其实就是data的编码，outputEncoding 输出的编码
     */
    let crypted= cipher.update(data,'utf-8','hex');
    crypted=crypted+cipher.final('hex')//数据还需要接收结尾字符
    return crypted;
}

let data='thisisdemothisisdemo';
let key ='node';
console.log(aesEncrypt(data,key));//812148c4d4f6f79c189fc9cae6a7f6afd2acca001aeb828ec066e68ee1af1623

/**
 * 
 * @param {*} encrypted 被加密过的数据
 * @param {*} key 密码
 */
function aseDecrpt(encrypted,key){
    const cipher = crypto.createDecipher('aes192',key);//根据key值穿件 ciper
    //update(data: string, inputEncoding: Encoding | undefined, outputEncoding: Encoding)
    /**
     * data 要被加密的数据 inputEncoding 其实就是data的编码，outputEncoding 输出的编码
     */
    let decrpt= cipher.update(encrypted,'hex','utf-8');
    decrpt=decrpt+cipher.final('utf-8')//数据还需要接收结尾字符
    return decrpt;
}
let encrypted='812148c4d4f6f79c189fc9cae6a7f6afd2acca001aeb828ec066e68ee1af1623';
//let key='node'.
console.log(aseDecrpt(encrypted,'node'));//thisisdemothisisdemo


/**
 * 非对称加密
 * RSA 比较经典的非对称加密，需要公钥与私钥
 * 
 * 比较经典的应用：https，支付宝与微信支付
 * 
 */

/**
 * 作业：一.建一个表 user，里面有字段 name，password ，当然还可以加入别的字段，要求用node实现，写入数据，
 *         password 需要被md5加密。查询数据时候能通过明白，加密后查找到对应的数据。
 * 
 *      二.复习class;自建框架需使用,await async (复习)
 * 
 * 
 * 
 */





